package cn.xzqwjw.taskmanager.common.customEnum;

/* 形式： sendError(int error_number)说明：用来向客户端发送错误信息
 * 这对调试程序有很大帮助。常用的常量级错误代码有：
 * SC_CONTINUE            状态码是100，表示客户端无法连接。
 * SC_SWITCHING_PROTOCOLS 状态码是101，表示服务器正向报头中注明的协议切换。
 * SC_OK                  状态码是200，表示请求被成功处理。
 * SC_CREATED             状态码是201，表示请求被成功处理，并在服务器方创建了一个新的资源。
 * SC_ACCEPTED            状态码是202，表示请求正在被处理，但尚未完成。
 * SC_NON_AUTHORITATIVE_INFORMATION  状态码是203，表示客户端所表达的mate信息并非来自服务器。
 * SC_NO_CONTENT          状态码是204，表示请求被成功处理，但没有新的信息返回。
 * SC_RESET_CONTENT       状态码是205，表示导致请求被发送的文档视图应该重置。
 * SC_PARTIAL_CONTENT     状态码是206，表示服务器已经完成对资源的GET请求。
 * SC_MULTI_CHOICES       状态码是300，表示对应于一系列表述的被请求资源都有明确的位置。
 * SC_MOVED_PERMANENTLY   状态码是301，表示请求所申请的资源已经被移到一个新的地方
 *                                     并且将来的参考点在请求中应当使用一个新的URL.
 * SC_MOVED_TEMPORARILY   状态码是302，表示请求所申请的资源已经被移到一个新的地方
 *                                     并且将来的参考点在请求中仍使用原来的URL.
 * SC_SEE_OTHER           状态码是303，表示请求的响应可以在一个不同的URL中找到。
 * SC_NOT_MODIFIED        状态码是304，表示一个有条件的GET操作发现资源可以利用，且没有被改变。
 * SC_USE_PROXY           状态码是305，表示被请求的资源必须通过特定位置的代理来访问。
 * SC_BAD_REQUEST         状态码是400，表示客户发出的请求句法不正确。
 * SC_UNAUTHORIZED        状态码是401，表示请求HTTP认证。
 * SC_PAYMENT_REQUIRED    状态码是402，表示为以后的使用保留。
 * SC_FORBIDDEN           状态码是403，表示服务器明白客户的请求，但拒绝响应。
 * SC_NOT_FOUND           状态码是404，表示所请求的资源不可用。
 * SC_METHOD_NOT_ALLOWED  状态码是405，表示在请求行中标示的方法不允许对请求URL所标明的资源使用。
 * SC_NOT_ACCEPTABLE      状态码是406，表示被请求的资源只能响应实体，
 *                                     而且此符合请求所发送的可接受头部域的实体的确包含不可接受的内容。
 * SC_PROXY_AUTHENTICATION_REQUIRED    状态码是407，表示客户端必须先向代理验证。
 * */

import lombok.Getter;

/**
 * @author rush
 */
@Getter
public enum ResponseCodeEnum {

  /*
   * 枚举的讲解参加 https://segmentfault.com/a/1190000012220863
   * 响应码枚举，参考HTTP状态码的语义
   * 响应状态码
   * 针对客户端向Web服务器发送的任意一个HTTP请求，不论在何种情况下得到一个响应，
   * 每个响应均具有一个由3位数字表示的状态码和相应的描述文字。
   * 不同数值的状态码体现了不同类型的响应状态，W3C对响应状态码的范围作了如下的规范。
   * <p>
   * 100~199：信息状态码，代表请求已被接受，需要继续处理
   * 200~299：成功状态码，代表请求已成功被服务器接收、理解、并接受
   * 300~399：重定向状态码，代表需要客户端采取进一步的操作才能完成请求
   * 400~499：客户端错误状态码，代表了客户端看起来可能发生了错误，妨碍了服务器的处理
   * 500~599：服务器错误状态码，代表了服务器在处理请求的过程中有错误或者异常状态发生
   * 也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
   * <p>
   * 400 BAD_REQUEST 常用在参数校验
   * 401 UNAUTHORIZED 未经验证的用户，常见于未登录
   * 403 FORBIDDEN 无权限
   * 404 NOT_FOUND 资源不存在
   * 500 INTERNAL_SERVER_ERROR 非业务类异常
   * 503 SERVICE_UNAVALIABLE 由容器抛出，自己的代码不要抛出这个异常
   */

  // 2xx 成功状态码，代表请求已成功被服务器接收、理解、并接受

  SUCCESS("20000", "OK"),
  OK_CREATED("20101", "新建数据成功"),
  OK_UPDATED("20102", "修改数据成功"),
  OK_PATCHED("20103", "修改部分数据成功"),
  OK_UPLOAD_FILE("20104", "上传文件成功"),
  // 202 Accepted - [*]：表示一个请求已经进入后台排队（异步任务）
  OK_ACCEPTED("20200", "一个请求已经进入后台排队"),
  // 204 NO CONTENT - [DELETE]：用户删除数据成功
  OK_DELETED("20400", "删除数据成功"),

  // 3xx 重定向状态码，代表需要客户端采取进一步的操作才能完成请求

  // 重定向
  REDIRECT("30000", "重定向"),

  // 4xx（请求错误），客户端错误状态码，代表了客户端看起来可能发生了错误，妨碍了服务器的处理

  // 失败，服务器不理解请求的语法
  BAD_REQUEST("40000", "请求参数错误"),
  PARAM_IS_NULL("40001", "请求参数为空"),
  PARSE_DATETIME_ERROR("40002", "解析日期时间格式错误"),
  PARSE_DATE_ERROR("40003", "解析日期格式错误"),
  PARSE_TIME_ERROR("40004", "解析时间格式错误"),
  // 未认证，未授权（客户试图未经授权访问受密码保护的页面，签名错误）
  UNAUTHORIZED("40100", "未认证请登录"),
  BAD_USERNAME("40101", "用户名错误"),
  BAD_PASSWORD("40102", "密码错误"),
  JWT_NONCE("40103", "JWT为空"),
  JWT_BAD_CHECK("40104", "JWT验证错误"),
  JWT_EXPIRATION("40105", "JWT已过期"),
  NON_ROLE("40106", "未分配角色"),
  NON_PURVIEW("40107", "未分配权限"),
  ACCOUNT_LOCKED("40108", "账号被锁定"),
  ACCOUNT_DISABLED("40109", "账号未启用"),
  ACCOUNT_EXPIRED("40110", "账号过期"),
  CREDENTIALS_EXPIRED("40111", "密码已过期"),
  USERNAME_EXISTED("40112", "用户名已存在"),
  USERNAME_NOT_FOUND("40113", "用户名不存在"),
  PHONE_EXISTED("40114", "手机号已存在"),
  PHONE_NOT_FOUND("40115", "手机号不存在"),
  // 资源不可用。服务器理解客户的请求，但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
  FORBIDDEN("40300", "权限不足，拒绝访问"),
  // 服务器找不到请求的网页，或者接口不存在
  NOT_FOUND("40400", "没有发现相应资源"),
  // 请求方法（GET、POST、HEAD、DELETE、PUT、TRACE等）对指定的资源不适用。
  METHOD_NOT_ALLOWED("40500", "请求方法错误"),
  // 指定的资源已经找到，但它的MIME类型和客户在accept头中所指定的不兼容
  NOT_ACCEPTABLE("40600", "请求类型错误"),
  NOT_ALLOWED_FILE_TYPE("40601", "不允许上传的文件类型"),
  NOT_ALLOWED_FILE_SIZE("40602", "上传的文件太大"),
  // 请求超时，服务器等候请求时超时
  REQUEST_TIMEOUT("40800", "请求超时"),
  // 422 UnProcessable entity - [POST/PUT/PATCH] 当创建一个对象时，发生一个验证错误
  UNPROCESSABLE_ENTITY("42200", "对象验证错误-可能已添加此对象"),
  ALREADY_EXISTED("42201", "资源已存在，不可重复"),
  // 客户端的会话已经过期，必须重新登录
  LOGIN_TIMEOUT("44000", "会话过期，请重新登录"),

  // 5xx 服务器错误状态码，代表了服务器在处理请求的过程中有错误或者异常状态发生

  // 服务器遇到了意料不到的情况，不能完成客户的请求
  INTERNAL_SERVER_ERROR("50000", "服务器内部错误"),
  ERROR_INSERT("50001", "服务器内部错误-添加失败"),
  ERROR_DELETE("50002", "服务器内部错误-删除失败"),
  ERROR_UPDATE("50003", "服务器内部错误-修改全部失败"),
  ERROR_PATCH("50004", "服务器内部错误-修改部分失败"),
  ERROR_DIRECTORY_CREATE("50005", "服务器内部错误-创建目录失败"),
  ERROR_FILE_CREATE("50006", "服务器内部错误-创建文件失败"),
  ERROR_FILE_UPLOAD("50007", "服务器内部错误-上传文件失败"),
  ERROR_FILE_RENAME("50008", "服务器内部错误-修改文件名失败"),
  ERROR_FILE_DELETE("50009", "服务器内部错误-删除文件失败"),
  ERROR_FILE_COPY("50010", "服务器内部错误-拷贝文件失败"),
  ERROR_FILE_NOT_FOUND("50011", "服务器内部错误-文件不存在"),
  ERROR_FILE_EXISTED("50012", "服务器内部错误-文件已存在"),
  ERROR_DRAW_WM_TXT("50020", "服务器内部错误-图片添加文字水印失败"),
  ERROR_DRAW_WM_IMG("50021", "服务器内部错误-图片添加图片水印失败"),
  ERROR_DRAW_THUMB("50022", "服务器内部错误-图片添加水印失败"),
  ERROR_DB_FILE_NOT_FOUND("50050", "数据库错误-文件不存在"),
  ERROR_DB_DRIVER("50051", "数据库错误-驱动程序错误"),
  ERROR_DB_CONNECT("50052", "数据库错误-连接错误"),
  ERROR_DB_QUERY("50053", "数据库错误-查询错误"),
  // 服务器不支持实现请求所需要的功能。
  // 例如，客户发出了一个服务器不支持的PUT请求。页眉值指定了未实现的配置
  NOT_IMPLEMENTED("50100", "服务器不支持的请求方法"),
  // 服务器作为网关或者代理时，为了完成请求访问下一个服务器，
  // 但该服务器返回了非法的应答。Web 服务器用作网关或代理服务器时收到了无效响应
  BAD_GATEWAY("50200", "网关无效响应"),
  // 服务器由于维护或者负载过重未能应答
  // 例如，Servlet可能在数据库连接池已满的情况下返回503
  // 服务器返回503时可以提供一个Retry-After头。
  SERVICE_UNAVAILABLE("50300", "服务不可用"),
  // 由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答
  GATEWAY_TIMEOUT("50400", "远程服务器无响应"),
  // 服务器不支持请求中所指明的HTTP版本
  HTTP_VERSION_NOT_SUPPORTED("50500", "服务器不支持请求中的HTTP版本"),
  // 520 错误包含了原始服务器返回意外响应的全部问题
  UNKNOWN_ERROR("52000", "意外响应");

  /**
   * 获取到对应实例的 statusCode 值
   */
  private final String statusCode;
  /**
   * 获取到对应实例的 message 值
   */
  private final String message;

  /**
   * 这里实际是定义了枚举的构造函数
   */
  ResponseCodeEnum(String statusCode, String message) {
    this.statusCode = statusCode;
    this.message = message;
  }

}